PROJEKT 1 EDA KRZYSZTOF KOWALSKI¶

Celem projektu jest wykonanie eksploracyjnej analizy danych (EDA) zbioru danych pochodzącego z WHO zawierającego informacje dotyczące zanieczyszczeń powietrza na różnych poziomach generalizacji.¶

Zbiór danych¶

Zbiór posiada pomiary z różnych lokalizacji na świecie podzielone na kraje i miasta.

Kolumny w zbiorze¶

Measurement Year - okres pobierania informacji o zanieczyszczeniach powietrza, rok pomiaru.
PM2.5 (μg/m3) - Stężenie pyłów PM2.5 w mikrogramach na metr sześcienny.
PM10 (μg/m3) - Stężenie pyłów PM10 w mikrogramach na metr sześcienny.
NO2 (μg/m3) - Stężenie dwutlenku azotu (NO2) w mikrogramach na metr sześcienny.
PM25 temporal coverage (%) - Pokrycie czasowe danych dotyczących pyłów PM2.5 (%).
PM10 temporal coverage (%) - Pokrycie czasowe danych dotyczących NO2 temporal coverage (%) - Pokrycie czasowe danych dotyczących dwutlenku azotu (%).
Reference - Odwołanie do źródła danych.
Number and type of monitoring stations - Liczba i typ stacji monitorujących.
Version of the database - Wersja bazy danych.
Status - Status danych.danych dotyczących - Status danych.

1. Wczytanie zbioru danych¶

Zbiór danych został wczytany korzystając z funkcji read_excel() z bilbioteki pandas

In [1]:
import pandas as pd
import warnings
import matplotlib.pyplot as plt
import seaborn as sns
warnings.filterwarnings('ignore')
In [2]:
who_data = pd.read_excel("who_aap_2021_v9_11august2022.xlsx", sheet_name = "AAP_2022_city_v9")
In [3]:
who_data.head()
Out[3]:
WHO Region ISO3 WHO Country Name City or Locality Measurement Year PM2.5 (μg/m3) PM10 (μg/m3) NO2 (μg/m3) PM25 temporal coverage (%) PM10 temporal coverage (%) NO2 temporal coverage (%) Reference Number and type of monitoring stations Version of the database Status
0 Eastern Mediterranean Region AFG Afghanistan Kabul 2019 119.77 NaN NaN 18.0 NaN NaN U.S. Department of State, United States Enviro... NaN 2022 NaN
1 European Region ALB Albania Durres 2015 NaN 17.65 26.63 NaN NaN 83.961187 European Environment Agency (downloaded in 2021) NaN 2022 NaN
2 European Region ALB Albania Durres 2016 14.32 24.56 24.78 NaN NaN 87.932605 European Environment Agency (downloaded in 2021) NaN 2022 NaN
3 European Region ALB Albania Elbasan 2015 NaN NaN 23.96 NaN NaN 97.853881 European Environment Agency (downloaded in 2021) NaN 2022 NaN
4 European Region ALB Albania Elbasan 2016 NaN NaN 26.26 NaN NaN 96.049636 European Environment Agency (downloaded in 2021) NaN 2022 NaN

Alternatywną funkcją, z której można skorzystać do wczytania zbioru do odpowiedniej struktury jest użycie itables. W tym celu przekonwertowana została ramka danych korzystając z funkcji show z biblioteki itables.

Skorzystanie z Itables daje możliwość interatywnego przeglądania wczytanego zbioru. Pozwala między innymi na: \

  • sortoowanie po wybranej kolumnie (rosnąco lub malejąco),
  • wyszukiwanie określonej wartości w zbiorze korzystając z Search
  • ustawieniu ilości rekordów, które widzimy (10, 25, 50 lub 100).
In [4]:
#!pip install itables
from itables import show
In [5]:
itable = show(who_data)
itable
WHO Region ISO3 WHO Country Name City or Locality Measurement Year PM2.5 (μg/m3) PM10 (μg/m3) NO2 (μg/m3) PM25 temporal coverage (%) PM10 temporal coverage (%) NO2 temporal coverage (%) Reference Number and type of monitoring stations Version of the database Status
Loading... (need help?)

2. Eksploracyjna analiza danych (EDA)¶

Zaczęto od sprawdzenia ilości danych w zbiorze.

In [6]:
who_data.shape
Out[6]:
(32191, 15)
In [7]:
who_data.dtypes
Out[7]:
WHO Region                                 object
ISO3                                       object
WHO Country Name                           object
City or Locality                           object
Measurement Year                            int64
PM2.5 (μg/m3)                             float64
PM10 (μg/m3)                              float64
NO2 (μg/m3)                               float64
PM25 temporal coverage (%)                float64
PM10 temporal coverage (%)                float64
NO2 temporal coverage (%)                 float64
Reference                                  object
Number and type of monitoring stations     object
Version of the database                     int64
Status                                    float64
dtype: object

Zbiór składa się z 15 kolumn (głownie typu object i float, są też dwie kolumny typu int) oraz 32 tysięcy rekordów.

In [8]:
who_data.describe()
Out[8]:
Measurement Year PM2.5 (μg/m3) PM10 (μg/m3) NO2 (μg/m3) PM25 temporal coverage (%) PM10 temporal coverage (%) NO2 temporal coverage (%) Version of the database Status
count 32191.000000 15048.000000 21109.000000 22200.000000 7275.000000 5381.000000 19890.000000 32191.000000 0.0
mean 2015.579354 22.920320 30.533252 20.619336 90.794096 90.583500 93.696804 2021.744214 NaN
std 2.752654 17.925906 29.312756 12.133388 14.872681 13.816311 10.451751 1.051897 NaN
min 2000.000000 0.010000 1.040000 0.000000 0.000000 2.568493 1.923077 2016.000000 NaN
25% 2014.000000 10.350000 16.980000 12.000000 88.595890 87.945205 93.207763 2022.000000 NaN
50% 2016.000000 16.000000 22.000000 18.800000 97.000000 96.039000 96.369863 2022.000000 NaN
75% 2018.000000 31.000000 31.300000 27.160000 99.000000 98.938000 98.926941 2022.000000 NaN
max 2021.000000 191.900000 540.000000 210.680000 100.000000 100.000000 100.000000 2022.000000 NaN
In [9]:
for col in who_data.columns:
  print(f'W kolumnie \033[1m{col}\033[0m znajduje się \033[1m{sum(who_data[col].isnull())}\033[0m brakujących wartości co stanowi \033[1m{round(100 * sum(who_data[col].isnull()) / len(who_data[col]), 3)}\033[0m%')
W kolumnie WHO Region znajduje się 1 brakujących wartości co stanowi 0.003%
W kolumnie ISO3 znajduje się 0 brakujących wartości co stanowi 0.0%
W kolumnie WHO Country Name znajduje się 0 brakujących wartości co stanowi 0.0%
W kolumnie City or Locality znajduje się 0 brakujących wartości co stanowi 0.0%
W kolumnie Measurement Year znajduje się 0 brakujących wartości co stanowi 0.0%
W kolumnie PM2.5 (μg/m3) znajduje się 17143 brakujących wartości co stanowi 53.254%
W kolumnie PM10 (μg/m3) znajduje się 11082 brakujących wartości co stanowi 34.426%
W kolumnie NO2 (μg/m3) znajduje się 9991 brakujących wartości co stanowi 31.037%
W kolumnie PM25 temporal coverage (%) znajduje się 24916 brakujących wartości co stanowi 77.401%
W kolumnie PM10 temporal coverage (%) znajduje się 26810 brakujących wartości co stanowi 83.284%
W kolumnie NO2 temporal coverage (%) znajduje się 12301 brakujących wartości co stanowi 38.213%
W kolumnie Reference znajduje się 5 brakujących wartości co stanowi 0.016%
W kolumnie Number and type of monitoring stations znajduje się 23433 brakujących wartości co stanowi 72.794%
W kolumnie Version of the database znajduje się 0 brakujących wartości co stanowi 0.0%
W kolumnie Status znajduje się 32191 brakujących wartości co stanowi 100.0%

W zbiorze znajduje się duża ilość wartości brakujących. Kolumny, w których wartości te są znaczącą częścią wszystkich wartości to:

  • PM2.5 (μg/m3): 53.25% wszystkich wartości
  • PM10 (μg/m3): 34.43% wszystkich wartości
  • NO2 (μg/m3): 31.04% wszystkich wartości
  • PM25 temporal coverage (%): 77.4% wszystkich wartości
  • PM10 temporal coverage (%): 83.28% wszystkich wartości
  • NO2 temporal coverage (%): 38.21% wszystkich wartości
  • Number of type of monitoring stations: 72.79% wszystkich wartości
  • Status: 100% wszytkich wartości

Przyglądając się bliżej każdej z kolumn, w której występuje mala, niezerowa ilość brakujących wartości:

  1. WHO Region
In [10]:
list(who_data['WHO Region'].unique())
Out[10]:
['Eastern Mediterranean Region',
 'European Region',
 'Region of the Americas',
 'Western Pacific Region',
 'South East Asia Region',
 'African Region',
 nan]
In [11]:
who_data[who_data['WHO Region'].isna()]
Out[11]:
WHO Region ISO3 WHO Country Name City or Locality Measurement Year PM2.5 (μg/m3) PM10 (μg/m3) NO2 (μg/m3) PM25 temporal coverage (%) PM10 temporal coverage (%) NO2 temporal coverage (%) Reference Number and type of monitoring stations Version of the database Status
24778 NaN LIE Liechtenstein Vaduz 2010 NaN 17.88 23.59 NaN 96.164 98.265 European Environment Information and Observati... NaN 2022 NaN

Brakująca wartość dla kolumny związanej z regionem występuje dla Liechtenstein, który bazując na wartościach z tej kolumny pasuje do "European Region". Dlatego ręcznie podmieniono tą wartość.

In [12]:
who_data.loc[who_data['ISO3'] == "LIE", 'WHO Region'] = 'European Region'
  1. Reference
In [13]:
#list(who_data['Reference'].unique())
In [14]:
who_data[who_data['Reference'].isna()]
Out[14]:
WHO Region ISO3 WHO Country Name City or Locality Measurement Year PM2.5 (μg/m3) PM10 (μg/m3) NO2 (μg/m3) PM25 temporal coverage (%) PM10 temporal coverage (%) NO2 temporal coverage (%) Reference Number and type of monitoring stations Version of the database Status
28209 Eastern Mediterranean Region QAT Qatar Doha 2017 44.0 148.0 29.0 98.0 96.0 99.0 NaN Roadside, residential and commercial area 2022 NaN
28210 Eastern Mediterranean Region QAT Qatar Doha 2018 44.0 181.0 47.0 99.0 97.0 99.0 NaN Roadside, residential and commercial area 2022 NaN
28211 Eastern Mediterranean Region QAT Qatar Doha 2019 41.0 208.0 42.0 97.0 97.0 99.0 NaN Roadside, residential and commercial area 2022 NaN
28212 Eastern Mediterranean Region QAT Qatar Doha 2020 33.0 108.0 28.0 98.0 98.0 99.0 NaN Roadside, residential and commercial area 2022 NaN
28213 Eastern Mediterranean Region QAT Qatar Doha 2021 38.0 150.0 30.0 97.0 96.0 99.0 NaN Roadside, residential and commercial area 2022 NaN

Wszystkie 5 brakujących wartości dla tej kolumny pochodzi z Qataru, ponieważ cieżko przewidzieć wartość bazując na innych informacjach - pozostawiono te wartości NaN.

Ponieważ, kolumna Status nie wnosi nic do analizy danych (występują w niej same wartości brakujące) postanowiono ją usunąć ze zbioru.
Dodatkowo kolumna Verion of the database również nie wnosi nic do analizy. Ukazuje ona jedynie wersjie bazy danych (w postaci roku), dlatego zdecydowano również usunąc ją.
Obie kolumny są technicznymi kolumnami, ważnymi do przetrzymywania danych w bazie danych, ale nieprzydatnymi dla analizy.

In [15]:
who_data.drop(columns = 'Status', inplace = True)
who_data.drop(columns = 'Version of the database', inplace = True)

Zależność między zmiennymi¶

Ten etap EDA zaczęto od stworzenia macierzy korelacji. Oraz stworzenia wykresu ukazującego korelację.

In [16]:
correlation_matrix = who_data.corr(numeric_only = True)
correlation_matrix
Out[16]:
Measurement Year PM2.5 (μg/m3) PM10 (μg/m3) NO2 (μg/m3) PM25 temporal coverage (%) PM10 temporal coverage (%) NO2 temporal coverage (%)
Measurement Year 1.000000 0.091205 -0.001178 -0.111787 -0.010997 -0.180056 0.085096
PM2.5 (μg/m3) 0.091205 1.000000 0.874187 0.430170 -0.096469 -0.208969 -0.209094
PM10 (μg/m3) -0.001178 0.874187 1.000000 0.305560 -0.319848 -0.232562 -0.289788
NO2 (μg/m3) -0.111787 0.430170 0.305560 1.000000 -0.091963 0.007328 -0.026477
PM25 temporal coverage (%) -0.010997 -0.096469 -0.319848 -0.091963 1.000000 0.609317 0.342581
PM10 temporal coverage (%) -0.180056 -0.208969 -0.232562 0.007328 0.609317 1.000000 0.679646
NO2 temporal coverage (%) 0.085096 -0.209094 -0.289788 -0.026477 0.342581 0.679646 1.000000
In [17]:
plt.figure(figsize = [15, 5])

plt.subplot(1, 3, 1)
sns.histplot(data = who_data, x = 'PM2.5 (μg/m3)', kde = True)
plt.title('PM2.5')
plt.grid()

plt.subplot(1, 3, 2)
sns.histplot(data = who_data, x = 'PM10 (μg/m3)', kde = True)
plt.title('PM10')
plt.grid()

plt.subplot(1, 3, 3)
sns.histplot(data = who_data, x = 'NO2 (μg/m3)', kde = True)
plt.title('NO2')
plt.grid()

plt.suptitle("Histogramy")
plt.tight_layout()
No description has been provided for this image
In [18]:
plt.figure(figsize = [15, 5])
plt.subplot(1, 3, 1)
sns.boxplot(data = who_data, y='PM2.5 (μg/m3)')
plt.title('PM2.5')
plt.grid()

plt.subplot(1, 3, 2)
sns.boxplot(data = who_data, y = 'PM10 (μg/m3)')
plt.title('PM10')
plt.grid()

plt.subplot(1, 3, 3)
sns.boxplot(data = who_data, y = 'NO2 (μg/m3)')
plt.title('NO2')
plt.grid()

plt.suptitle("Wykresy pudełkowe")
plt.tight_layout()
No description has been provided for this image

Histogramy stężeń zanieczyszczeń nie posiadają rozkładów normalnych. Dla poszczególnych zanieczyszczeń bazując na histogramach i wykresach pudełkowych:

  • PM2.5 posiada największa ilość wystąpień około 1200 dla wartości stężenia około 15
  • PM10 posiada podobny rozkład do PM2.5 - posiada znacznie wyższa zmierzoną wartość maksymalną
  • NO2 posiada delikatnie wyższą najczęściej występująca wartość - około 20
In [19]:
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title('Macierz korelacji dla danych dotyczących zanieczyszczenia powietrza')
Out[19]:
Text(0.5, 1.0, 'Macierz korelacji dla danych dotyczących zanieczyszczenia powietrza')
No description has been provided for this image

Macierz korelacji ukazuje występowanie zależnosci liniowej pomiędzy zmiennymi. Wysoka zależność dodatnia występuje pomiędzy kolumnami związanymi z zanieczyszczeniami PM2.5 oraz PM10, które dodatkowo są dosyć dobrze skorelowane z kolejną kolumna związana z zanieczyszczeniami jaką jest NO2.
Pomiędzy pozostałymi kolumnami korelacja jest niewielka (zarówno dodatnia jak i ujemna).

Przyglądając się jeszcze bliżej zależności liniowej stworzono wykres typu pairplot.

In [20]:
plt.figure(figsize=(10, 8))
sns.pairplot(who_data, hue = 'Measurement Year')
plt.title('Wykresy zależności liniowej między zmiennymi')
Out[20]:
Text(0.5, 1.0, 'Wykresy zależności liniowej między zmiennymi')
<Figure size 1000x800 with 0 Axes>
No description has been provided for this image

Powyższa figura potwierdza występowanie dodaniej zależności liniowej między zmiennymi związanymi z wielkością określonego zanieczyszczenia.

3. EDA na różnych poziomach generalizacji¶

a) Region¶

Analiza ogólnych statystyk¶

In [21]:
region_stats = who_data.groupby('WHO Region').agg({'PM2.5 (μg/m3)': ['mean', 'median', 'std'],
                                                   'PM10 (μg/m3)': ['mean', 'median', 'std'],
                                                   'NO2 (μg/m3)': ['mean', 'median', 'std']})
region_stats
Out[21]:
PM2.5 (μg/m3) PM10 (μg/m3) NO2 (μg/m3)
mean median std mean median std mean median std
WHO Region
African Region 27.257120 22.86 20.435911 51.906625 41.390 38.927441 23.160242 19.51 15.597572
Eastern Mediterranean Region 38.063258 33.00 19.843202 121.317951 109.800 76.441168 45.715101 38.05 29.840508
European Region 14.002193 12.81 6.315753 23.013879 20.740 10.934350 20.389040 18.98 11.319598
Region of the Americas 11.389410 8.00 8.387063 30.677423 26.085 18.969999 15.757890 14.00 10.055134
South East Asia Region 42.841212 36.50 23.432654 94.626582 84.000 51.400386 22.099986 19.33 12.845567
Western Pacific Region 40.324123 39.11 18.012102 32.781478 22.400 27.102957 31.970357 33.00 14.094483

Rejony w zależności od mierzonego stężenia zanieczysczenia posiadają różny rankinch najwyższych średnich stężeń zanieczyszczeń. I tak:

  • dla PM2.5 najwyższą średnia posiada Południowo-Wschodnia Azja, a najniższą Ameryka
  • dla PM10 najwyższą średnią posiada region Morza Śródziemnego, natomiast najniższą Europa
  • dla NO2 najwyższą średnią posiada region Morza Śródziemnego, natomiast najniższą Ameryka

Liczba obserwacji w każdym z regionów¶

In [22]:
plt.figure(figsize = [10, 6])
region_counts = who_data['WHO Region'].value_counts()
sns.barplot(x = region_counts.index, y = region_counts.values)
plt.title('Liczba obserwacji dla poszczególnych regionów')
plt.xlabel('WHO Region')
plt.ylabel('Liczba obserwacji')
plt.xticks(rotation = 90)
Out[22]:
([0, 1, 2, 3, 4, 5],
 [Text(0, 0, 'European Region'),
  Text(1, 0, 'Western Pacific Region'),
  Text(2, 0, 'Region of the Americas'),
  Text(3, 0, 'South East Asia Region'),
  Text(4, 0, 'Eastern Mediterranean Region'),
  Text(5, 0, 'African Region')])
No description has been provided for this image

Regionem najczęściej badanym jest Europa z ogromną różnicą wyprzedza inne rejony z iloscią obserwacji około 20 000 (dla porównania drugi z rejonów - Zachód Pacyfiku posiada około 5 000 obserwacji). Region Afrykański jest najrzadziej badany. Niską ilościa obserwacji cechuje się również wschodni rejon Morza Śródziemnego (co może byc powodem niespodziewnanie wysokich wartości stężeń zanieczyszczeń na tym obszarze).

Wykresy rozrzutu¶

In [23]:
plt.figure(figsize = [15, 5])

plt.subplot(1, 3, 1)
sns.scatterplot(data = who_data, x = 'PM2.5 (μg/m3)', y = 'NO2 (μg/m3)', hue = 'WHO Region')
plt.title('PM2.5 vs NO2')
plt.grid()

plt.subplot(1, 3, 2)
sns.scatterplot(data = who_data, x = 'PM10 (μg/m3)', y = 'NO2 (μg/m3)', hue = 'WHO Region')
plt.title('PM10 vs NO2')
plt.grid()

plt.subplot(1, 3, 3)
sns.scatterplot(data = who_data, x = 'PM2.5 (μg/m3)', y = 'PM10 (μg/m3)', hue = 'WHO Region')
plt.title('PM2.5 vs PM10')
plt.grid()

plt.suptitle("Wykresy rozrzutu")
plt.tight_layout()
No description has been provided for this image

Każda z badanych par stężeń zanieczyszczeń prezentuje się inaczej. W przypadku porównania PM2.5 i PM10 widoczna jest najwyższa dodatnia zależność liniowa dla każdego z rejonów (gorsze zależności są dla regionu afrykańskiego i Morza Śródziemnego, ale są to rejony posiadające najmniejszą liczbę obserwacji). Dla wszystkich z par tendencja każdego z rejonów jest podobna.

Zmiana zanieczyszczeń w czasie¶

In [24]:
pollutants = ['PM2.5 (μg/m3)', 'PM10 (μg/m3)', 'NO2 (μg/m3)']
who_regions = who_data['WHO Region'].unique()
colors = ['blue', 'orange', 'green']

fig, axes = plt.subplots(2, 3, figsize = [15, 10])

for j, region in enumerate(who_regions):
    region_data = who_data[who_data['WHO Region'] == region]
    for k, pollutant in enumerate(pollutants):
        pollutant_data = region_data[['Measurement Year', pollutant]].dropna()
        sns.lineplot(data = pollutant_data, x = 'Measurement Year', y = pollutant, ax = axes[j // 3, j % 3], color = colors[k], label = pollutant)
        axes[j // 3, j % 3].set_title(region)
        axes[j // 3, j % 3].set_xlabel('Measurement Year')
        axes[j // 3, j % 3].set_ylabel(pollutant)
        axes[j // 3, j % 3].grid()
        axes[j // 3, j % 3].set_xlim(pollutant_data['Measurement Year'].min(), pollutant_data['Measurement Year'].max())

axes[-1, -1].legend()
plt.suptitle('Zmiany stężeń zanieczyszczeń powietrza w czasie')
plt.tight_layout()
No description has been provided for this image

Przyglądają się zmianie stężeń zanieczyszczeń w czasie w rejonie najczęściej badanym (Europa) widoczny jest spadek stężeń w ostatnich latach. Podobna sytuacja widoczna jest dla rejonu Ameryk. Ciekawie prezentuje sięwykres dla obszaru zachodu Pacyfiku - widoczny jest drastyczny spadek cząsteczek PM2.5 przy wzroście PM10 i NO2. Dla południowo-wschodniej Azji stężenia w latach (2016-2019) ustabilizowały się na podobnym poziomie.

Macierze korelacji¶

In [25]:
fig, axes = plt.subplots(2, 3, figsize = [20, 15])

for i, region in enumerate(who_regions):
    region_data = who_data[who_data['WHO Region'] == region]
    correlation_matrix = region_data.corr(numeric_only = True)
    sns.heatmap(correlation_matrix, ax = axes[i // 3, i % 3], annot = True, cmap = 'coolwarm', fmt = ".2f")
    axes[i // 3, i % 3].set_title(region)
    axes[i // 3, i % 3].set_xticklabels(axes[i // 3, i % 3].get_xticklabels(), rotation = 90)

plt.suptitle('Macierze korelacji dla danych dotyczących zanieczyszczenia powietrza, podzielone na regiony WHO')
plt.tight_layout()
No description has been provided for this image

Macierze korelacji ukazują podobną informacje do wykresów rozrzutu - dobrze skorelowane są wszystkie z mierzonych cząstek (szczególnie PM2.5 i PM10). Najwyższa korelacja widoczna jest dla Rejonu zachodu Pacyfiku (0.97 pomiedzy PM2.5 i PM10i aż 0.71 pomiędzy NO2 i PM2.5). Ciekawa obserwacją jest identyczna korelacja pomiędzy stężeniami PM2.5 i PM10 dla południowo-wschodnie Azji, Europy i Ameryk (0.84)

b) Kraje¶

Analiza ogólnych statystyk¶

In [26]:
country_stats = who_data.groupby('WHO Country Name').agg({'PM2.5 (μg/m3)': ['mean', 'median', 'std'],
                                                   'PM10 (μg/m3)': ['mean', 'median', 'std'],
                                                   'NO2 (μg/m3)': ['mean', 'median', 'std']})
top_5_pm25 = country_stats['PM2.5 (μg/m3)']['mean'].nlargest(5)
top_5_pm10 = country_stats['PM10 (μg/m3)']['mean'].nlargest(5)
top_5_no2 = country_stats['NO2 (μg/m3)']['mean'].nlargest(5)

print("Top 5 kraje o najwyższych średnich stężeniach PM2.5:")
print(country_stats.loc[top_5_pm25.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])

print("\nTop 5 kraje o najwyższych średnich stężeniach PM10:")
print(country_stats.loc[top_5_pm10.index, [('PM10 (μg/m3)', 'mean'), ('PM10 (μg/m3)', 'median'), ('PM10 (μg/m3)', 'std')]])

print("\nTop 5 kraje o najwyższych średnich stężeniach NO2:")
print(country_stats.loc[top_5_no2.index, [('NO2 (μg/m3)', 'mean'), ('NO2 (μg/m3)', 'median'), ('NO2 (μg/m3)', 'std')]])
Top 5 kraje o najwyższych średnich stężeniach PM2.5:
                 PM2.5 (μg/m3)                   
                          mean  median        std
WHO Country Name                                 
Afghanistan         119.770000  119.77        NaN
Cameroon             82.666667   67.00  43.661577
Bangladesh           75.127000   70.52  28.373649
Mongolia             73.865833   74.50  27.980191
Tajikistan           71.520000   71.52        NaN

Top 5 kraje o najwyższych średnich stężeniach PM10:
                 PM10 (μg/m3)                     
                         mean   median         std
WHO Country Name                                  
Pakistan             333.5425  323.000  190.140257
Egypt                227.0000  225.000   51.648814
Ghana                175.3750  177.785   16.977449
Uganda               170.4000  170.400         NaN
Mongolia             169.2200  153.050   45.885529

Top 5 kraje o najwyższych średnich stężeniach NO2:
                           NO2 (μg/m3)                   
                                  mean  median        std
WHO Country Name                                         
Iran (Islamic Republic of)   69.443902  64.970  41.378545
Iraq                         53.527000  53.370  16.599366
Lebanon                      53.000000  53.000   8.485281
Bahrain                      51.625000  51.625   5.932626
Mongolia                     46.400000  49.000   8.294577

Powyżej widoczne jest 5 krajów posiadajace najwyższe średnie stęzenia każdego z mierzonych zanieczyszczeń. Są to kraje azjatyckie oraz afrykańskie. Co, ciekawe dla każdej z cząstek istnieją różne "liderujące" kraje (wyjątkiem jest Mongolia, która pojawia się w każdym z rankingów).

In [27]:
less_5_pm25 = country_stats['PM2.5 (μg/m3)']['mean'].nsmallest(5)
less_5_pm10 = country_stats['PM10 (μg/m3)']['mean'].nsmallest(5)
less_5_no2 = country_stats['NO2 (μg/m3)']['mean'].nsmallest(5)

print("Top 5 kraje o najniższych średnich stężeniach PM2.5:")
print(country_stats.loc[less_5_pm25.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])

print("\nTop 5 kraje o najniższych średnich stężeniach PM10:")
print(country_stats.loc[less_5_pm10.index, [('PM10 (μg/m3)', 'mean'), ('PM10 (μg/m3)', 'median'), ('PM10 (μg/m3)', 'std')]])

print("\nTop 5 kraje o najniższych średnich stężeniach NO2:")
print(country_stats.loc[less_5_no2.index, [('NO2 (μg/m3)', 'mean'), ('NO2 (μg/m3)', 'median'), ('NO2 (μg/m3)', 'std')]])
Top 5 kraje o najniższych średnich stężeniach PM2.5:
                 PM2.5 (μg/m3)                 
                          mean median       std
WHO Country Name                               
Bahamas               4.163333  4.060  1.018937
Iceland               5.588065  4.550  3.349053
Estonia               6.018148  5.620  1.679390
Sweden                6.165315  5.900  2.220703
Finland               6.200472  6.135  1.577751

Top 5 kraje o najniższych średnich stężeniach PM10:
                 PM10 (μg/m3)                 
                         mean median       std
WHO Country Name                              
Bahamas              4.650000   4.49  1.088853
Iceland             10.614054   7.42  6.396617
Estonia             12.723000  12.79  4.051279
Finland             12.739095  12.37  3.481434
Canada              13.651172  13.00  4.420643

Top 5 kraje o najniższych średnich stężeniach NO2:
                    NO2 (μg/m3)                 
                           mean median       std
WHO Country Name                                
Estonia                6.775179  5.610  4.800989
Myanmar                6.815000  6.100  2.530909
Iceland                7.896053  5.150  6.575193
Trinidad and Tobago    9.600000  8.300  3.852380
Australia              9.772121  9.055  4.413393

Ranking dla krajów posiadających najniższe średnie stężenia ukazuje kraje, które pochodzą głównie z Europy oraz rejonu Ameryk. Bardzo niskie średnie wartości dla wszystkich z mierzonych cząstek są w Islandi, Estoni oraz Finlandii.

Ilość obserwacji dla krajów z najwyższymi stężeniami zanieczyszczeń¶

In [28]:
top_5_countries_pm25 = country_stats['PM2.5 (μg/m3)']['mean'].nlargest(5).index
top_5_countries_pm10 = country_stats['PM10 (μg/m3)']['mean'].nlargest(5).index
top_5_countries_no2 = country_stats['NO2 (μg/m3)']['mean'].nlargest(5).index

top_5_data_pm25 = who_data[who_data['WHO Country Name'].isin(top_5_countries_pm25)]
top_5_data_pm10 = who_data[who_data['WHO Country Name'].isin(top_5_countries_pm10)]
top_5_data_no2 = who_data[who_data['WHO Country Name'].isin(top_5_countries_no2)]

observations_pm25 = top_5_data_pm25.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
observations_pm10 = top_5_data_pm10.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
observations_no2 = top_5_data_no2.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()

plt.figure(figsize=[15, 10])

plt.subplot(3, 1, 1)
observations_pm25.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji PM2.5 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()

plt.subplot(3, 1, 2)
observations_pm10.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji PM10 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()

plt.subplot(3, 1, 3)
observations_no2.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji NO2 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()

plt.tight_layout()
No description has been provided for this image

Kraje, posiadające najwyższe średnie wartości zanieczyszczeń są bardzo rzadko badane. Obserwacja ta wydaje się być nielogiczna - posiadając wysokie wartości stężeń tych cząstek powinno się je często badać oraz podejmować kroki w celu ich redukcji. Niestety kraje są często średnio rozwinięte i niezamożne, które nie są odpowiednio wyedukowane o skutkach niewłściwej polityki klimatyczne.

Ilość obserwacji dla krajów z najniższymi stężeniami zanieczyszczeń¶

In [29]:
less_5_countries_pm25 = country_stats['PM2.5 (μg/m3)']['mean'].nsmallest(5).index
less_5_countries_pm10 = country_stats['PM10 (μg/m3)']['mean'].nsmallest(5).index
less_5_countries_no2 = country_stats['NO2 (μg/m3)']['mean'].nsmallest(5).index

less_5_data_pm25 = who_data[who_data['WHO Country Name'].isin(less_5_countries_pm25)]
less_5_data_pm10 = who_data[who_data['WHO Country Name'].isin(less_5_countries_pm10)]
less_5_data_no2 = who_data[who_data['WHO Country Name'].isin(less_5_countries_no2)]

less_observations_pm25 = less_5_data_pm25.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
less_observations_pm10 = less_5_data_pm10.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
less_observations_no2 = less_5_data_no2.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()

plt.figure(figsize=[15, 10])

plt.subplot(3, 1, 1)
less_observations_pm25.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji PM2.5 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()

plt.subplot(3, 1, 2)
less_observations_pm10.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji PM10 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()

plt.subplot(3, 1, 3)
less_observations_no2.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji NO2 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()

plt.tight_layout()
No description has been provided for this image

Kraje posiadające najniższe stężenia posiadają wiekszą liczbę obserwacji niż te posiadające najwyższe stężenia. Mimo to, liczba ta dalej nie jest wysoka.

Liczba obserwacji w każdym z regionów¶

In [30]:
#poszukac dalej jak usunac te wartosci wyswietlane przez jupytera bo szpącą
plt.figure(figsize = [20, 6])
country_counts = who_data['WHO Country Name'].value_counts()
sns.barplot(x = country_counts.index, y = country_counts.values)
plt.title('Liczba obserwacji dla poszczególnych regionów')
plt.xlabel('WHO Country Name')
plt.ylabel('Liczba obserwacji')
plt.xticks(rotation = 90)
Out[30]:
([0,
  1,
  2,
  3,
  4,
  5,
  6,
  7,
  8,
  9,
  10,
  11,
  12,
  13,
  14,
  15,
  16,
  17,
  18,
  19,
  20,
  21,
  22,
  23,
  24,
  25,
  26,
  27,
  28,
  29,
  30,
  31,
  32,
  33,
  34,
  35,
  36,
  37,
  38,
  39,
  40,
  41,
  42,
  43,
  44,
  45,
  46,
  47,
  48,
  49,
  50,
  51,
  52,
  53,
  54,
  55,
  56,
  57,
  58,
  59,
  60,
  61,
  62,
  63,
  64,
  65,
  66,
  67,
  68,
  69,
  70,
  71,
  72,
  73,
  74,
  75,
  76,
  77,
  78,
  79,
  80,
  81,
  82,
  83,
  84,
  85,
  86,
  87,
  88,
  89,
  90,
  91,
  92,
  93,
  94,
  95,
  96,
  97,
  98,
  99,
  100,
  101,
  102,
  103,
  104,
  105,
  106,
  107,
  108,
  109,
  110,
  111,
  112,
  113,
  114,
  115,
  116,
  117],
 [Text(0, 0, 'China'),
  Text(1, 0, 'Italy'),
  Text(2, 0, 'Germany'),
  Text(3, 0, 'Spain'),
  Text(4, 0, 'India'),
  Text(5, 0, 'France'),
  Text(6, 0, 'United States of America'),
  Text(7, 0, 'Poland'),
  Text(8, 0, 'Switzerland'),
  Text(9, 0, 'Canada'),
  Text(10, 0, 'Austria'),
  Text(11, 0, 'United Kingdom'),
  Text(12, 0, 'Czechia'),
  Text(13, 0, 'Turkey'),
  Text(14, 0, 'Romania'),
  Text(15, 0, 'Belgium'),
  Text(16, 0, 'Brazil'),
  Text(17, 0, 'Netherlands'),
  Text(18, 0, 'Sweden'),
  Text(19, 0, 'Portugal'),
  Text(20, 0, 'Finland'),
  Text(21, 0, 'Australia'),
  Text(22, 0, 'Bulgaria'),
  Text(23, 0, 'Chile'),
  Text(24, 0, 'Mexico'),
  Text(25, 0, 'Iran (Islamic Republic of)'),
  Text(26, 0, 'Norway'),
  Text(27, 0, 'Republic of Korea'),
  Text(28, 0, 'Slovakia'),
  Text(29, 0, 'New Zealand'),
  Text(30, 0, 'Hungary'),
  Text(31, 0, 'South Africa'),
  Text(32, 0, 'Greece'),
  Text(33, 0, 'Israel'),
  Text(34, 0, 'Slovenia'),
  Text(35, 0, 'Thailand'),
  Text(36, 0, 'Ireland'),
  Text(37, 0, 'Croatia'),
  Text(38, 0, 'Philippines'),
  Text(39, 0, 'Lithuania'),
  Text(40, 0, 'Colombia'),
  Text(41, 0, 'Peru'),
  Text(42, 0, 'Serbia'),
  Text(43, 0, 'Japan'),
  Text(44, 0, 'Kuwait'),
  Text(45, 0, 'Denmark'),
  Text(46, 0, 'Bangladesh'),
  Text(47, 0, 'Estonia'),
  Text(48, 0, 'Luxembourg'),
  Text(49, 0, 'North Macedonia'),
  Text(50, 0, 'Bosnia and Herzegovina'),
  Text(51, 0, 'Iceland'),
  Text(52, 0, 'Cyprus'),
  Text(53, 0, 'Latvia'),
  Text(54, 0, 'Bahrain'),
  Text(55, 0, 'Malta'),
  Text(56, 0, 'United Arab Emirates'),
  Text(57, 0, 'Viet Nam'),
  Text(58, 0, 'Montenegro'),
  Text(59, 0, 'Malaysia'),
  Text(60, 0, 'Ecuador'),
  Text(61, 0, 'Morocco'),
  Text(62, 0, 'Nepal'),
  Text(63, 0, 'Bhutan'),
  Text(64, 0, 'Myanmar'),
  Text(65, 0, 'Jordan'),
  Text(66, 0, 'Costa Rica'),
  Text(67, 0, 'Iraq'),
  Text(68, 0, 'Indonesia'),
  Text(69, 0, 'Albania'),
  Text(70, 0, 'Mongolia'),
  Text(71, 0, 'Pakistan'),
  Text(72, 0, 'Mauritius'),
  Text(73, 0, 'Singapore'),
  Text(74, 0, 'Jamaica'),
  Text(75, 0, 'Senegal'),
  Text(76, 0, 'El Salvador'),
  Text(77, 0, 'Qatar'),
  Text(78, 0, 'Trinidad and Tobago'),
  Text(79, 0, 'Andorra'),
  Text(80, 0, 'Lebanon'),
  Text(81, 0, 'Saudi Arabia'),
  Text(82, 0, 'Guatemala'),
  Text(83, 0, 'Argentina'),
  Text(84, 0, 'Egypt'),
  Text(85, 0, 'Ghana'),
  Text(86, 0, 'Sri Lanka'),
  Text(87, 0, 'Monaco'),
  Text(88, 0, 'Ethiopia'),
  Text(89, 0, 'Honduras'),
  Text(90, 0, 'Georgia'),
  Text(91, 0, 'Madagascar'),
  Text(92, 0, 'Tunisia'),
  Text(93, 0, 'Uganda'),
  Text(94, 0, 'Cameroon'),
  Text(95, 0, 'Venezuela (Bolivarian Republic of)'),
  Text(96, 0, 'Bahamas'),
  Text(97, 0, 'Russian Federation'),
  Text(98, 0, 'Kazakhstan'),
  Text(99, 0, 'Ukraine'),
  Text(100, 0, 'Kenya'),
  Text(101, 0, 'Uzbekistan'),
  Text(102, 0, 'Bolivia (Plurinational State of)'),
  Text(103, 0, 'Fiji'),
  Text(104, 0, 'Uruguay'),
  Text(105, 0, 'United Republic of Tanzania'),
  Text(106, 0, 'Paraguay'),
  Text(107, 0, 'Turkmenistan'),
  Text(108, 0, 'Tajikistan'),
  Text(109, 0, 'Algeria'),
  Text(110, 0, 'Liechtenstein'),
  Text(111, 0, 'Cuba'),
  Text(112, 0, 'Panama'),
  Text(113, 0, 'Nigeria'),
  Text(114, 0, 'Kyrgyzstan'),
  Text(115, 0, 'Maldives'),
  Text(116, 0, "Lao People's Democratic Republic"),
  Text(117, 0, 'Afghanistan')])
No description has been provided for this image

Krajem najczęściej badanym są Chiny, a następnie kraje Europejskie - Włochy, Niemcy, Hiszpania. Czołową piątke zamykają Indie.
Bazując na liczbie obswerwacji zdecydowano do dalszej analizy wybrać kraje, w których liczba obserwacji jest większa niż 100.

Zmiana ilości obserwacji w latach 5 najczęściej występujących krajów¶

In [31]:
top_5_countries_most_measurements = who_data['WHO Country Name'].value_counts().nlargest(5).index
top_5_data_most_measurements = who_data[who_data['WHO Country Name'].isin(top_5_countries_most_measurements)]
observations_most_measurements = top_5_data_most_measurements.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()

plt.figure(figsize=[10, 6])
observations_most_measurements.plot(marker='o')
plt.title('Liczba obserwacji dla 5 krajów, które najczęściej przeprowadzały pomiary, w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.tight_layout()
<Figure size 1000x600 with 0 Axes>
No description has been provided for this image

Dlakrajów z najczęstrzymi pomiarami od 2014 roku liczba pomiarów z roku na rok delikatnie rośnie. Wyjątkiem jest lider - Chiny, który w roku 2017 zanotował ogromny ponad 300% wzrost ilości obserwacji i delikatny spadek po roku 2018. Wzrost z 2017 roku wysunał ich na pierwsze miejsce w rankingu z ogromną przewagą (około 1000 pomiarów rocznych do +/- 400).

In [32]:
country_obs_counts = who_data.groupby(['WHO Country Name', 'Measurement Year']).size().unstack().sum(axis=1)
countries_over_100_obs = country_obs_counts[country_obs_counts > 100].index

#print("Kraje, dla których liczba obserwacji jest większa niż 100:")
#print(countries_over_100_obs)

top_5_pm25_largest = country_stats.loc[countries_over_100_obs, ('PM2.5 (μg/m3)', 'mean')].nlargest(5)
top_5_pm10_largest = country_stats.loc[countries_over_100_obs, ('PM10 (μg/m3)', 'mean')].nlargest(5)
top_5_no2_largest = country_stats.loc[countries_over_100_obs, ('NO2 (μg/m3)', 'mean')].nlargest(5)

print("Top 5 kraje o najwyższych średnich stężeniach PM2.5 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_pm25_largest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("Top 5 kraje o najwyższych średnich stężeniach PM10 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_pm10_largest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("Top 5 kraje o najwyższych średnich stężeniach NO2 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_no2_largest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
Top 5 kraje o najwyższych średnich stężeniach PM2.5 (powyzej 100 obserwacji):
                           PM2.5 (μg/m3)                  
                                    mean median        std
WHO Country Name                                          
China                          43.072988  41.49  16.356075
India                          40.444798  36.00  20.200245
Iran (Islamic Republic of)     31.508929  29.25  14.604950
Philippines                    29.710526  29.00  11.361166
Chile                          24.977411  25.41   9.976247
Top 5 kraje o najwyższych średnich stężeniach PM10 (powyzej 100 obserwacji):
                           PM2.5 (μg/m3)                  
                                    mean median        std
WHO Country Name                                          
Iran (Islamic Republic of)     31.508929  29.25  14.604950
India                          40.444798  36.00  20.200245
China                          43.072988  41.49  16.356075
Chile                          24.977411  25.41   9.976247
Turkey                         22.831111  21.42   7.730100
Top 5 kraje o najwyższych średnich stężeniach NO2 (powyzej 100 obserwacji):
                           PM2.5 (μg/m3)                   
                                    mean  median        std
WHO Country Name                                           
Iran (Islamic Republic of)     31.508929  29.250  14.604950
Republic of Korea              23.274510  23.000   3.582567
China                          43.072988  41.490  16.356075
Mexico                         23.026333  23.315   5.014018
Turkey                         22.831111  21.420   7.730100

Rankingi krajów gdzie liczba obserwacji jest większa od 100 ukazują, że najbardziej zanieczyszczone mierzonymi cząstkami są Chiny (kraj tworzący pomiary najczęściej), Indie oraz Iran.

In [33]:
top_5_pm25_smallest = country_stats.loc[countries_over_100_obs, ('PM2.5 (μg/m3)', 'mean')].nsmallest(5)
top_5_pm10_smallest = country_stats.loc[countries_over_100_obs, ('PM10 (μg/m3)', 'mean')].nsmallest(5)
top_5_no2_smallest = country_stats.loc[countries_over_100_obs, ('NO2 (μg/m3)', 'mean')].nsmallest(5)

print("Top 5 kraje o najniższych średnich stężeniach PM2.5 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_pm25_smallest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("Top 5 kraje o najniższych średnich stężeniach PM10 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_pm10_smallest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("Top 5 kraje o najniższych średnich stężeniach NO2 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_no2_smallest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
Top 5 kraje o najniższych średnich stężeniach PM2.5 (powyzej 100 obserwacji):
                 PM2.5 (μg/m3)                 
                          mean median       std
WHO Country Name                               
Sweden                6.165315  5.900  2.220703
Finland               6.200472  6.135  1.577751
Canada                6.627647  6.025  2.205813
Norway                6.913800  7.135  2.380776
Portugal              7.937835  7.490  3.335800
Top 5 kraje o najniższych średnich stężeniach PM10 (powyzej 100 obserwacji):
                 PM2.5 (μg/m3)                  
                          mean  median       std
WHO Country Name                                
Finland               6.200472   6.135  1.577751
Canada                6.627647   6.025  2.205813
Ireland               8.536531   8.350  2.207306
Norway                6.913800   7.135  2.380776
Switzerland          10.516102  10.100  2.889568
Top 5 kraje o najniższych średnich stężeniach NO2 (powyzej 100 obserwacji):
                 PM2.5 (μg/m3)                 
                          mean median       std
WHO Country Name                               
Australia             8.417000  7.600  5.577581
Canada                6.627647  6.025  2.205813
New Zealand           9.459773  9.790  3.164996
Finland               6.200472  6.135  1.577751
Ireland               8.536531  8.350  2.207306

Najniższe wartości zanieczyszczeń posiadają kraje Skandynawskie oraz Australia i Canada.

In [34]:
selected_countries_pm25 = who_data[who_data['WHO Country Name'].isin(top_5_pm25_largest.index)]
selected_countries_pm10 = who_data[who_data['WHO Country Name'].isin(top_5_pm10_largest.index)]
selected_countries_no2 = who_data[who_data['WHO Country Name'].isin(top_5_no2_largest.index)]

fig, axes = plt.subplots(3, 1, figsize=(12, 18))

sns.lineplot(data=selected_countries_pm25, x='Measurement Year', y='PM2.5 (μg/m3)', hue='WHO Country Name', ax=axes[0])
axes[0].set_title('Zmiany stężenia PM2.5 w wybranych krajach')
axes[0].set_xlabel('Rok pomiaru')
axes[0].set_ylabel('Stężenie PM2.5 (μg/m3)')
axes[0].set_xlim(selected_countries_pm25['Measurement Year'].min(), selected_countries_pm25['Measurement Year'].max())
axes[0].legend(title='Kraj')
axes[0].grid()

sns.lineplot(data=selected_countries_pm10, x='Measurement Year', y='PM10 (μg/m3)', hue='WHO Country Name', ax=axes[1])
axes[1].set_title('Zmiany stężenia PM10 w wybranych krajach')
axes[1].set_xlabel('Rok pomiaru')
axes[1].set_ylabel('Stężenie PM10 (μg/m3)')
axes[1].set_xlim(selected_countries_pm10['Measurement Year'].min(), selected_countries_pm10['Measurement Year'].max())
axes[1].legend(title='Kraj')
axes[1].grid()

sns.lineplot(data=selected_countries_no2, x='Measurement Year', y='NO2 (μg/m3)', hue='WHO Country Name', ax=axes[2])
axes[2].set_title('Zmiany stężenia NO2 w wybranych krajach')
axes[2].set_xlabel('Rok pomiaru')
axes[2].set_ylabel('Stężenie NO2 (μg/m3)')
axes[2].set_xlim(selected_countries_no2['Measurement Year'].min(), selected_countries_no2['Measurement Year'].max())
axes[2].legend(title='Kraj')
axes[2].grid()

plt.tight_layout()
No description has been provided for this image

Widoczne jest wyrażne wypłaszczenie zmian wartości mierzonych stężeń po roku 2016.

In [35]:
selected_countries_pm25 = who_data[who_data['WHO Country Name'].isin(top_5_pm25_smallest.index)]
selected_countries_pm10 = who_data[who_data['WHO Country Name'].isin(top_5_pm10_smallest.index)]
selected_countries_no2 = who_data[who_data['WHO Country Name'].isin(top_5_no2_smallest.index)]

fig, axes = plt.subplots(3, 1, figsize=(12, 18))

sns.lineplot(data=selected_countries_pm25, x='Measurement Year', y='PM2.5 (μg/m3)', hue='WHO Country Name', ax=axes[0])
axes[0].set_title('Zmiany stężenia PM2.5 w wybranych krajach')
axes[0].set_xlabel('Rok pomiaru')
axes[0].set_ylabel('Stężenie PM2.5 (μg/m3)')
axes[0].set_xlim(selected_countries_pm25['Measurement Year'].min(), selected_countries_pm25['Measurement Year'].max())
axes[0].legend(title='Kraj')
axes[0].grid()

sns.lineplot(data=selected_countries_pm10, x='Measurement Year', y='PM10 (μg/m3)', hue='WHO Country Name', ax=axes[1])
axes[1].set_title('Zmiany stężenia PM10 w wybranych krajach')
axes[1].set_xlabel('Rok pomiaru')
axes[1].set_ylabel('Stężenie PM10 (μg/m3)')
axes[1].set_xlim(selected_countries_pm10['Measurement Year'].min(), selected_countries_pm10['Measurement Year'].max())
axes[1].legend(title='Kraj')
axes[1].grid()

sns.lineplot(data=selected_countries_no2, x='Measurement Year', y='NO2 (μg/m3)', hue='WHO Country Name', ax=axes[2])
axes[2].set_title('Zmiany stężenia NO2 w wybranych krajach')
axes[2].set_xlabel('Rok pomiaru')
axes[2].set_ylabel('Stężenie NO2 (μg/m3)')
axes[2].set_xlim(selected_countries_no2['Measurement Year'].min(), selected_countries_no2['Measurement Year'].max())
axes[2].legend(title='Kraj')
axes[2].grid()

plt.tight_layout()
No description has been provided for this image

c) Miasta¶

10 najczęściej badanych miast¶

In [36]:
plt.figure(figsize = [20, 6])
cities_counts = who_data['City or Locality'].value_counts()[:100]
sns.barplot(x = cities_counts.index, y = cities_counts.values)
plt.title('Liczba obserwacji dla poszczególnych miast')
plt.xlabel('WHO Country Name')
plt.ylabel('Liczba obserwacji')
plt.xticks(rotation = 90)
Out[36]:
([0,
  1,
  2,
  3,
  4,
  5,
  6,
  7,
  8,
  9,
  10,
  11,
  12,
  13,
  14,
  15,
  16,
  17,
  18,
  19,
  20,
  21,
  22,
  23,
  24,
  25,
  26,
  27,
  28,
  29,
  30,
  31,
  32,
  33,
  34,
  35,
  36,
  37,
  38,
  39,
  40,
  41,
  42,
  43,
  44,
  45,
  46,
  47,
  48,
  49,
  50,
  51,
  52,
  53,
  54,
  55,
  56,
  57,
  58,
  59,
  60,
  61,
  62,
  63,
  64,
  65,
  66,
  67,
  68,
  69,
  70,
  71,
  72,
  73,
  74,
  75,
  76,
  77,
  78,
  79,
  80,
  81,
  82,
  83,
  84,
  85,
  86,
  87,
  88,
  89,
  90,
  91,
  92,
  93,
  94,
  95,
  96,
  97,
  98,
  99],
 [Text(0, 0, 'Saxon'),
  Text(1, 0, 'Avully'),
  Text(2, 0, 'Basel'),
  Text(3, 0, 'Meyrin'),
  Text(4, 0, 'Bern'),
  Text(5, 0, 'Lugano'),
  Text(6, 0, 'Lausanne'),
  Text(7, 0, 'Payerne'),
  Text(8, 0, 'Ebikon'),
  Text(9, 0, 'Opfikon'),
  Text(10, 0, 'Salamanca'),
  Text(11, 0, 'Bratislava'),
  Text(12, 0, 'Ittigen'),
  Text(13, 0, 'Winterthur'),
  Text(14, 0, 'Cuenca'),
  Text(15, 0, 'London'),
  Text(16, 0, 'Luzern'),
  Text(17, 0, 'Ethekwini'),
  Text(18, 0, 'Southampton'),
  Text(19, 0, 'Montana'),
  Text(20, 0, 'Seoul'),
  Text(21, 0, 'Lima'),
  Text(22, 0, 'Gyeonggi-Do'),
  Text(23, 0, 'San Fernando'),
  Text(24, 0, 'Gert Sibande'),
  Text(25, 0, 'Jeju-Do'),
  Text(26, 0, 'Incheon'),
  Text(27, 0, 'Nkangala'),
  Text(28, 0, 'Ulsan'),
  Text(29, 0, 'Gwangju'),
  Text(30, 0, 'Daejeon'),
  Text(31, 0, 'Laval'),
  Text(32, 0, 'Daegu'),
  Text(33, 0, 'Busan'),
  Text(34, 0, 'Gangwon-Do'),
  Text(35, 0, 'Sedibeng'),
  Text(36, 0, 'Bathurst'),
  Text(37, 0, 'Barcelona'),
  Text(38, 0, 'Tehran'),
  Text(39, 0, 'Rigi'),
  Text(40, 0, 'Singapore'),
  Text(41, 0, 'Chaumont'),
  Text(42, 0, 'Gyeongsangnam-Do'),
  Text(43, 0, 'Gyeongsangbuk-Do'),
  Text(44, 0, 'Chungcheongbuk-Do'),
  Text(45, 0, 'Waterberg'),
  Text(46, 0, 'Magadino'),
  Text(47, 0, 'Chungcheongnam-Do'),
  Text(48, 0, 'Jeollabuk-Do'),
  Text(49, 0, 'Jeollanam-Do'),
  Text(50, 0, 'Ha Noi'),
  Text(51, 0, 'Manama'),
  Text(52, 0, 'San Francisco-Oakland-Hayward (Ca)'),
  Text(53, 0, 'Madera (Ca)'),
  Text(54, 0, 'Bakersfield (Ca)'),
  Text(55, 0, 'Fairbanks (Ak)'),
  Text(56, 0, 'Dhaka'),
  Text(57, 0, 'Santa Maria-Santa Barbara (Ca)'),
  Text(58, 0, 'Locarno'),
  Text(59, 0, 'Les Giettes'),
  Text(60, 0, 'Massongex'),
  Text(61, 0, 'Le Locle'),
  Text(62, 0, 'Le Landeron'),
  Text(63, 0, 'Vallejo-Fairfield (Ca)'),
  Text(64, 0, 'Chittagong'),
  Text(65, 0, 'San Luis Obispo-Paso Robles-Arroyo Grande (Ca)'),
  Text(66, 0, 'Atlanta-Sandy Springs-Roswell (Ga)'),
  Text(67, 0, 'Omaha-Council Bluffs (Ne-Ia)'),
  Text(68, 0, 'Giubiasco'),
  Text(69, 0, 'Albuquerque (Nm)'),
  Text(70, 0, 'Härkingen'),
  Text(71, 0, 'San Jose-Sunnyvale-Santa Clara (Ca)'),
  Text(72, 0, 'Washington-Arlington-Alexandria (Dc-Va-Md-Wv)'),
  Text(73, 0, 'Allentown-Bethlehem-Easton (Pa-Nj)'),
  Text(74, 0, 'Santa Rosa (Ca)'),
  Text(75, 0, 'Jungfraujoch'),
  Text(76, 0, 'Eureka-Arcata-Fortuna (Ca)'),
  Text(77, 0, 'La Chaux'),
  Text(78, 0, 'El Paso (Tx)'),
  Text(79, 0, 'El Centro (Ca)'),
  Text(80, 0, 'Anchorage (Ak)'),
  Text(81, 0, 'Durango (Co)'),
  Text(82, 0, 'Visalia-Porterville (Ca)'),
  Text(83, 0, 'Langenthal'),
  Text(84, 0, 'Genève'),
  Text(85, 0, 'Mendrisio'),
  Text(86, 0, 'Davenport-Moline-Rock Island (Ia-Il)'),
  Text(87, 0, 'Urban Honolulu (Hi)'),
  Text(88, 0, 'Schwyz'),
  Text(89, 0, 'Boston-Cambridge-Newton (Ma-Nh)'),
  Text(90, 0, 'Sion'),
  Text(91, 0, 'Sissach'),
  Text(92, 0, 'Payson (Az)'),
  Text(93, 0, 'Solothurn'),
  Text(94, 0, 'St Gallen'),
  Text(95, 0, 'Tänikon'),
  Text(96, 0, 'Thônex'),
  Text(97, 0, 'Thun'),
  Text(98, 0, 'Dakar'),
  Text(99, 0, 'Pittsburgh (Pa)')])
No description has been provided for this image
In [37]:
#!pip install folium
#!pip install geopy
import folium
from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent = 'my_geocoder')
world_map = folium.Map(location = [20, 0], zoom_start = 2)
for city, count in cities_counts.items():
    location = geolocator.geocode(city)
    if location:
        lat, lon = location.latitude, location.longitude 
        folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'red')).add_to(world_map)
world_map
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=San+Luis+Obispo-Paso+Robles-Arroyo+Grande+%28Ca%29&format=json&limit=1
Out[37]:
Make this Notebook Trusted to load map: File -> Trust Notebook

10 miast posiadających największą średnią wartość stężeń¶

In [38]:
cities_stats = who_data.groupby('City or Locality').agg({'PM2.5 (μg/m3)': ['mean', 'median', 'std'],
                                                   'PM10 (μg/m3)': ['mean', 'median', 'std'],
                                                   'NO2 (μg/m3)': ['mean', 'median', 'std']})
top_10_pm25 = cities_stats.loc[cities_counts.index, 'PM2.5 (μg/m3)']['mean'].nlargest(10)
top_10_pm10 = cities_stats.loc[cities_counts.index, 'PM10 (μg/m3)']['mean'].nlargest(10)
top_10_no2 = cities_stats.loc[cities_counts.index, 'NO2 (μg/m3)']['mean'].nlargest(10)

print("Top 5 kraje o najwyższych średnich stężeniach PM2.5:")
print(cities_stats.loc[top_10_pm25.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])

print("\nTop 5 kraje o najwyższych średnich stężeniach PM10:")
print(cities_stats.loc[top_10_pm10.index, [('PM10 (μg/m3)', 'mean'), ('PM10 (μg/m3)', 'median'), ('PM10 (μg/m3)', 'std')]])

print("\nTop 5 kraje o najwyższych średnich stężeniach NO2:")
print(cities_stats.loc[top_10_no2.index, [('NO2 (μg/m3)', 'mean'), ('NO2 (μg/m3)', 'median'), ('NO2 (μg/m3)', 'std')]])
Top 5 kraje o najwyższych średnich stężeniach PM2.5:
                  PM2.5 (μg/m3)                   
                           mean  median        std
City or Locality                                  
Dhaka                 75.353000  73.235  16.798171
Chittagong            69.263000  65.825  14.226632
Manama                57.370000  60.750   7.550490
Ha Noi                52.593333  49.360  14.995133
Sedibeng              36.940000  32.970   9.680417
Tehran                31.610000  31.390   3.597527
Lima                  30.682857  30.140   6.297523
Dakar                 29.880000  29.710   7.497594
Jeollabuk-Do          27.666667  27.500   5.202563
Chungcheongbuk-Do     26.500000  27.000   3.016621

Top 5 kraje o najwyższych średnich stężeniach PM10:
                  PM10 (μg/m3)                    
                          mean   median        std
City or Locality                                  
Dhaka               139.387500  141.065  25.387524
Dakar               135.517143  136.190   7.068325
Manama              131.356667  120.500  54.362944
Chittagong          122.174000  120.250  19.956229
Tehran               82.084286   83.670   7.149070
Lima                 63.592727   61.190  12.914875
Sedibeng             63.320000   61.410  12.316069
Nkangala             56.855556   49.940  16.085480
Gyeonggi-Do          50.916667   53.000   5.484828
Chungcheongbuk-Do    49.000000   51.000   7.745967

Top 5 kraje o najwyższych średnich stężeniach NO2:
                 NO2 (μg/m3)                   
                        mean  median        std
City or Locality                               
Tehran             82.698000  84.970  13.997577
Seoul              57.990769  60.160   5.308915
Gyeonggi-Do        51.230000  53.580   5.561115
Dhaka              50.830000  42.010  16.226403
Incheon            49.350000  49.820   5.384993
Ulsan              41.203333  42.300   3.252141
Barcelona          40.463750  39.630   3.471451
Daegu              40.263333  39.480   4.773486
Luzern             40.103571  40.955   6.484402
Mendrisio          39.230000  40.300   7.220965
In [39]:
geolocator = Nominatim(user_agent = 'my_geocoder')
world_map = folium.Map(location = [20, 0], zoom_start = 2)
for city in top_10_pm25.index:
    location = geolocator.geocode(city)
    if location:
        lat, lon = location.latitude, location.longitude 
        folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'green')).add_to(world_map)
        
for city in top_10_pm10.index:
    location = geolocator.geocode(city)
    if location:
        lat, lon = location.latitude, location.longitude 
        folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'blue')).add_to(world_map)
        
for city in top_10_no2.index:
    location = geolocator.geocode(city)
    if location:
        lat, lon = location.latitude, location.longitude 
        folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'red')).add_to(world_map)

legend_html = """
     <div style="position: fixed; 
                 bottom: 50px; left: 50px; width: 150px; height: 120px; 
                 border:2px solid grey; z-index:9999; font-size:14px;
                 background-color:white;
                 ">
     &nbsp; <strong>Legenda</strong><br>
     &nbsp; PM2.5 &nbsp; <i class="fa fa-map-marker fa-2x" style="color:green"></i><br>
     &nbsp; PM10 &nbsp; <i class="fa fa-map-marker fa-2x" style="color:blue"></i><br>
     &nbsp; NO2 &nbsp; <i class="fa fa-map-marker fa-2x" style="color:red"></i>
      </div>
     """
world_map.get_root().html.add_child(folium.Element(legend_html))
world_map
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=Seoul&format=json&limit=1
Out[39]:
Make this Notebook Trusted to load map: File -> Trust Notebook

10 miast posiadających najniższą średnią wartość stężeń¶

In [40]:
cities_stats = who_data.groupby('City or Locality').agg({'PM2.5 (μg/m3)': ['mean', 'median', 'std'],
                                                   'PM10 (μg/m3)': ['mean', 'median', 'std'],
                                                   'NO2 (μg/m3)': ['mean', 'median', 'std']})
less_10_pm25 = cities_stats.loc[cities_counts.index, 'PM2.5 (μg/m3)']['mean'].nsmallest(10)
less_10_pm10 = cities_stats.loc[cities_counts.index, 'PM10 (μg/m3)']['mean'].nsmallest(10)
less_10_no2 = cities_stats.loc[cities_counts.index, 'NO2 (μg/m3)']['mean'].nsmallest(10)

print("Top 10 kraje o najniższych średnich stężeniach PM2.5:")
print(cities_stats.loc[less_10_pm25.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])

print("\nTop 10 kraje o najniższych średnich stężeniach PM10:")
print(cities_stats.loc[less_10_pm10.index, [('PM10 (μg/m3)', 'mean'), ('PM10 (μg/m3)', 'median'), ('PM10 (μg/m3)', 'std')]])

print("\nTop 10 kraje o najniższych średnich stężeniach NO2:")
print(cities_stats.loc[less_10_no2.index, [('NO2 (μg/m3)', 'mean'), ('NO2 (μg/m3)', 'median'), ('NO2 (μg/m3)', 'std')]])
Top 10 kraje o najniższych średnich stężeniach PM2.5:
                                    PM2.5 (μg/m3)                 
                                             mean median       std
City or Locality                                                  
Urban Honolulu (Hi)                       4.13000  3.685  1.490511
Montana                                   4.80000  4.800  0.424264
Anchorage (Ak)                            5.34300  5.265  0.794915
Rigi                                      5.41000  5.150  0.872353
Boston-Cambridge-Newton (Ma-Nh)           5.45000  5.350  0.804674
Eureka-Arcata-Fortuna (Ca)                5.97500  5.850  0.434933
Le Locle                                  6.00000  6.000       NaN
San Jose-Sunnyvale-Santa Clara (Ca)       6.38125  5.400  2.631395
Santa Maria-Santa Barbara (Ca)            6.50000  7.000  1.513275
Albuquerque (Nm)                          6.90000  6.900       NaN

Top 10 kraje o najniższych średnich stężeniach PM10:
                                              PM10 (μg/m3)                  
                                                      mean  median       std
City or Locality                                                            
Jungfraujoch                                      2.390000   2.400  0.425441
Rigi                                              7.420909   7.400  0.784990
Chaumont                                          7.430909   7.500  0.922447
Les Giettes                                       7.620000   7.350  1.216370
Washington-Arlington-Alexandria (Dc-Va-Md-Wv)    10.341667  10.750  2.226750
Le Locle                                         11.775000  11.600  1.716100
Allentown-Bethlehem-Easton (Pa-Nj)               11.900000  11.500  0.871780
La Chaux                                         12.220000  12.150  1.376630
Santa Rosa (Ca)                                  12.250000  11.975  1.725946
Boston-Cambridge-Newton (Ma-Nh)                  12.400000  12.950  2.516347

Top 10 kraje o najniższych średnich stężeniach NO2:
                                               NO2 (μg/m3)                 
                                                      mean median       std
City or Locality                                                           
Jungfraujoch                                      0.230000  0.200  0.048305
Bathurst                                          3.000000  3.000  1.154701
Les Giettes                                       3.880000  3.450  1.093211
San Luis Obispo-Paso Robles-Arroyo Grande (Ca)    4.488889  4.600  0.841790
Santa Maria-Santa Barbara (Ca)                    4.592000  4.335  1.143890
Eureka-Arcata-Fortuna (Ca)                        5.240000  5.050  0.732120
Chaumont                                          5.573636  5.600  0.802898
Rigi                                              6.176364  6.200  1.208199
Urban Honolulu (Hi)                               6.183333  6.050  0.877306
Durango (Co)                                      6.864000  6.700  1.319446
In [41]:
geolocator = Nominatim(user_agent = 'my_geocoder')
world_map = folium.Map(location = [20, 0], zoom_start = 2)
for city in less_10_pm25.index:
    location = geolocator.geocode(city)
    if location:
        lat, lon = location.latitude, location.longitude 
        folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'green')).add_to(world_map)
        
for city in less_10_pm10.index:
    location = geolocator.geocode(city)
    if location:
        lat, lon = location.latitude, location.longitude 
        folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'blue')).add_to(world_map)
        
for city in less_10_no2.index:
    location = geolocator.geocode(city)
    if location:
        lat, lon = location.latitude, location.longitude 
        folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'red')).add_to(world_map)

legend_html = """
     <div style="position: fixed; 
                 bottom: 50px; left: 50px; width: 150px; height: 120px; 
                 border:2px solid grey; z-index:9999; font-size:14px;
                 background-color:white;
                 ">
     &nbsp; <strong>Legenda</strong><br>
     &nbsp; PM2.5 &nbsp; <i class="fa fa-map-marker fa-2x" style="color:green"></i><br>
     &nbsp; PM10 &nbsp; <i class="fa fa-map-marker fa-2x" style="color:blue"></i><br>
     &nbsp; NO2 &nbsp; <i class="fa fa-map-marker fa-2x" style="color:red"></i>
      </div>
     """
world_map.get_root().html.add_child(folium.Element(legend_html))
world_map
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=San+Jose-Sunnyvale-Santa+Clara+%28Ca%29&format=json&limit=1
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=San+Luis+Obispo-Paso+Robles-Arroyo+Grande+%28Ca%29&format=json&limit=1
Out[41]:
Make this Notebook Trusted to load map: File -> Trust Notebook

4. Mapa¶

In [42]:
#!pip install geopandas
import geopandas as gpd
In [43]:
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
merged_data = world.merge(who_data, how='left', left_on='iso_a3', right_on='ISO3')
merged_data[['PM2.5 (μg/m3)', 'PM10 (μg/m3)', 'NO2 (μg/m3)']] = merged_data[['PM2.5 (μg/m3)', 'PM10 (μg/m3)', 'NO2 (μg/m3)']].fillna(0)

fig, axes = plt.subplots(3, 1, figsize = [15, 15])
merged_data.plot(column='PM2.5 (μg/m3)', cmap = 'OrRd', linewidth = 0.8, ax = axes[0], edgecolor = '0.8', legend = True)
axes[0].set_title('PM2.5')

merged_data.plot(column='PM10 (μg/m3)', cmap = 'OrRd', linewidth = 0.8, ax = axes[1], edgecolor = '0.8', legend = True)
axes[1].set_title('PM10')

merged_data.plot(column='NO2 (μg/m3)', cmap = 'OrRd', linewidth = 0.8, ax = axes[2], edgecolor = '0.8', legend = True)
axes[2].set_title('NO2')

fig.suptitle("Rozkłady stężęń zanieczyszczeń na mapie świata")
Out[43]:
Text(0.5, 0.98, 'Rozkłady stężęń zanieczyszczeń na mapie świata')
No description has been provided for this image

5. Wnioski na temat wpływu zanieczyszczenia powietrza na dane regiony, kraje i miasta.¶

Po wykonanej analizie, nasuwające się wnioski to:

  • Kraje dobrze rozwinięte (głównie kraje Europejskie, ale również część Azji oraz Ameryka) badają stężenia zanieczyszczeń znacznie częściej niż kraje słabo rozwinięte (między innymi Afryka).
  • W krajach częsciej badających stężenia zanieczyszczeń widoczne jest ustabliziowanie lub spadek wielkości stężęń badanych cząstek.
  • Kraje wysoko rozwinięte posiadają niższe stężęń zanieczyszeń niz kraje słabo rozwinięte.
  • Na badanym okresie widoczny jest wzrost ilości badanych próbek z roku na rok.

6. Potencjalne zastosowania wykorzystanych danych w uczeniu maszynowym¶

Po wykonaniu EDA na różnych poziomach generalizacji:

  • Zbiór wydaje się być dobrym do próby stworzenia na nim modelu uczenia maszynowego przewidującego stężenia zanieczyszczeń w danej stacji w przyszłości.
  • Dodatkowo istnieje możliwość implementacji modelu, który bazując na danych wartościach zanieczyszczeń spróbuje przewidzieć z jakiego rejonu, kraju lub stacji pochodziły dane.
  • Ciekawa wydaje się być również próba estymacji zmiany liczby pomieranych próbek przez kraj w zależności od zmiany stężeń zanieczyszczeń.
In [ ]: